package org.hbkj.springbootmybatis.dao;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.hbkj.springbootmybatis.entity.BuyDo;
import org.springframework.stereotype.Repository;

/**
 * 处理购物车添加、订单创建及库存扣减的数据库操作，
 * 适配 shoppingcart 表结构（cartid、userid、goodsid、quantity、totalamount、createtime ）
 */
@Mapper
@Repository
public interface BuyDao {

    /**
     * 根据用户ID和商品ID查询购物车记录
     * @param userId 用户ID
     * @param goodsId 商品ID
     * @return 匹配的购物车记录实体，无匹配则返回null
     */
    BuyDo selectByUserIdAndGoodsId(@Param("userId") Integer userId, @Param("goodsId") Integer goodsId);

    /**
     * 新增商品到购物车（插入shoppingcart表）
     * 需保证 BuyDo 中包含 userId、goodsId、quantity、totalAmount（对应表 totalamount 字段）等必要属性，
     * createTime 可由数据库自动生成（如表设置默认值为当前时间）或在业务层赋值后传入
     * @param buyDo 封装了购物车添加信息的实体，至少包含 userId、goodsId、quantity、totalAmount
     * @return 插入成功的行数，正常插入返回 1
     */
    int addToCart(BuyDo buyDo);

    /**
     * 创建订单（插入orders表）
     * BuyDo 需包含订单相关必要属性：userId、goodsId、totalPrice、orderStatus（可业务层默认赋值）、orderTime（可数据库生成或业务层赋值）等
     * @param buyDo 封装了订单信息的实体
     * @return 插入成功的行数，正常插入返回 1
     */
    int createOrder(BuyDo buyDo);

    /**
     * 扣减商品库存（更新goods表的remaining字段）
     * 需保证扣减后库存不能为负数，可在 SQL 中通过条件限制（如 `remaining >= #{quantity}` ）
     * @param goodsId 商品ID
     * @param quantity 购买数量，即要扣减的库存数量
     * @return 更新成功的行数，库存充足时返回 1，库存不足返回 0
     */
    int deductStock(@Param("goodsId") Integer goodsId, @Param("quantity") Integer quantity);
}